package com.bms.client.service.impl;

import com.bms.client.pojo.XiangGuanWenDang;
import com.bms.client.mapper.XiangGuanWenDangMapper;
import com.bms.client.pojo.XiangMu;
import org.springframework.stereotype.Service;
import com.bms.client.service.XiangGuanWenDangService;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 项目相关文档表(XiangGuanWenDang)表服务实现类
 *
 * @author k-3101
 * @since 2021-03-16 14:48:09
 * @version 1.0
 */
@Service("xiangGuanWenDangService")
public class XiangGuanWenDangServiceImpl implements XiangGuanWenDangService {
    @Resource
    private XiangGuanWenDangMapper xiangGuanWenDangMapper;

    /**
     * 根据模糊条件查询总个数
     *
     * @return 返回查询到的总个数
     */
    @Override
    public Map<String, Object> chaXunCount(String wenDangMing, String wenDangLeiRong, String xiangMuId) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.xiangGuanWenDangMapper.chaXunCount(wenDangMing, wenDangLeiRong, xiangMuId));
        return map;
    }

    /**
     * 查询所有数据
     *
     * @return 返回所有数据
     */
    @Override
    public Map<String, Object> chaXunAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.xiangGuanWenDangMapper.chaXunAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Map<String, Object> chaXunById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("obj", this.xiangGuanWenDangMapper.chaXunById(id));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param page        查询起始位置
     * @param wenDangMing 查询条数
     * @return 对象列表
     */
    @Override
    public Map<String, Object> chaXunFenYe(int page, String wenDangMing, String wenDangLeiRong, String xiangMuId) {
        // 获取当前表中的总记录
        int tableCount = this.xiangGuanWenDangMapper.chaXunCount(wenDangMing, wenDangLeiRong, xiangMuId);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        int xiaBiao = (page - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.xiangGuanWenDangMapper.chaXunFenYe(xiaBiao, wenDangMing, wenDangLeiRong, xiangMuId));
        return map;
    }

    /**
     * 新增数据
     *
     * @param xiangGuanWenDang 实例对象
     * @return 实例对象
     */
    @Override
    public Map<String, Object> xinZeng(HttpServletRequest request, MultipartFile file, XiangGuanWenDang xiangGuanWenDang) {
        UUID uuid = UUID.randomUUID();//新增没有上传id所以使用uuid
        Map<String, Object> map = new HashMap<>();
        String suffix = "";
        String fileName = "";
        System.out.println("=============================MultipartFile=" + file.isEmpty());
        if (file != null && !file.isEmpty()) {
            // 组装文件存储路径（绝对路径）  例如： /touXiangImg/idValue/
            suffix = File.separator + "xiangGuanWenDang" + File.separator + uuid + File.separator;//大文件夹名需要改，id或者uuid给到小文件名，防止文件名串了造成混乱
            // c:/tomcat/target/webapp
            // c:/tomcat/target/webapp/touXiangImg/idValue/
            String path = null;
            try {
                path = ResourceUtils.getURL("classpath:").getPath() + "/static" + suffix;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            System.out.println("path=" + path);
            // 获取原文件名
            fileName = file.getOriginalFilename();
            System.out.println("文档名字：" + fileName);
            // 创建文件实例
            // c:/tomcat/target/webapp/touXiangImg/idValue/one.png
            File filePath = new File(path, fileName);
            System.out.println("上传地址：" + filePath);
            // 如果文件目录不存在，创建目录
            if (!filePath.getParentFile().exists()) {
                filePath.getParentFile().mkdirs();
                System.out.println("创建目录");
            }
            // 写入文件
            try {
                file.transferTo(filePath);

                String wenDangLeiRong = suffix + fileName;
                xiangGuanWenDang.setWenDangLeiRong(wenDangLeiRong);
                String filename[] = fileName.split("\\.");
                System.out.println(filename[0]);
                xiangGuanWenDang.setWenDangMing(filename[0]);
                xiangGuanWenDangMapper.xinZeng(xiangGuanWenDang);

                map.put("code", 200);
                map.put("msg", "新增文档成功");
                map.put("xiangGuanWenDang", xiangGuanWenDang);
                return map;
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {

            String wenDangLeiRong = suffix + fileName;
            xiangGuanWenDang.setWenDangLeiRong(wenDangLeiRong);
            xiangGuanWenDangMapper.xinZeng(xiangGuanWenDang);

            map.put("code", 200);
            map.put("msg", "新增文档表成功");
        }

        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param xiangGuanWenDang 实例对象
     * @return 实例对象
     */
    @Override
    public Map<String, Object> gengXinById(XiangGuanWenDang xiangGuanWenDang) {
//        this.xiangGuanWenDangMapper.gengXinById(xiangGuanWenDang);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public Map<String, Object> shanChuById(String id) {
        this.xiangGuanWenDangMapper.shanChuById(id);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        return map;
    }

    /**
     * 通过地址下载一条数据
     *
     * @return 是否成功
     */
    @Override
    public void xiaZai(String wenDangLeiRong, HttpServletRequest request, HttpServletResponse response) {
        // 需要传过来一个文件地址(数据库里的文件地址  String diZhi)
        String fileName = wenDangLeiRong;
        if (fileName != null && !fileName.trim().equals("")) {
            String wuLiLuJing = null;
            try {
                wuLiLuJing = ResourceUtils.getURL("classpath:").getPath() + "/static";
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // E:\IdeaProjects\zonghe\out\artifacts\zonghe_war_exploded\myfile\PLC_Server.rar
            System.out.println("wuLiLuJing=" + wuLiLuJing);
            File file = new File(wuLiLuJing + File.separator + fileName);
            System.out.println(file);
            try {
                // 查找服务器物理路径所在位置

                if (file.exists()) {
                    FileInputStream fis = new FileInputStream(file);
                    String filename = URLEncoder.encode(file.getName(), "utf-8"); // 解决中文文件名下载后乱码的问题
                    byte[] b = new byte[fis.available()];
                    fis.read(b);
                    response.setCharacterEncoding("UTF-8");
                    response.setHeader("Content-Disposition", "attachment; filename=" + filename + "");
                    //获取响应报文输出流对象
                    ServletOutputStream out = response.getOutputStream();
                    //输出
                    out.write(b);
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}